<?php
class Outcome extends MY_Controller {

	// Modelos usados en las funciones del controlador
	var $modelOutcomeDAO = 'Outcome_dao';
	var $modelOutcomeDTO = 'Outcome_dto';

	var $modelOutputDAO = 'Output_dao';

	var $modelBusinessLineDAO = 'Business_line_dao';
	var $modelBusinessLineDTO = 'Business_line_dto';
	
	// Vistas utilizadas en las funciones del controlador
	var $editionView = 'outcome/outcome_new_view';
	var $gridView = 'outcome/outcome_all_view';
	var $resultMessageView = '';
	
	// Vista a la que debe redirigirse al guardar/borrar un outcome
	var $redirectMethod = 'information/getAll';
	
	// Datos para pasar a las vistas
	var $pageTitle = '';
	
	private $controllerName = 'outcome';
	
	public function __construct()
    {
    	parent::__construct();
		
		// Éstos modelos los cargo al inicio ya que los utilizo en la mayoría de los métodos
		$this->load->model("$this->modelOutcomeDAO", 'Outcome_dao');
		$this->load->model("$this->modelOutcomeDTO", 'Outcome_dto');
		
		$this->resultMessageView = $this->template->getResultMessageView();
	}
	
	private function _loadBusinessLineModels()
	{
		$this->load->model("$this->modelBusinessLineDAO", 'Business_line_dao');
		$this->load->model("$this->modelBusinessLineDTO", 'Business_line_dto');
	}
	
	private function _getAll($idBusinessLine = 0)
	{	
		$this->pageTitle = 'All Outcomes';
		
		if ($idBusinessLine == 0) { $condiciones = array(); }
		else { $condiciones = array('idBusinessLine' => $idBusinessLine); }
		
		// Obtengo la lista de todas las líneas de negocio cargadas
		$dataView['outcomes'] = $this->Outcome_dao->obtenerObjetos($condiciones);
		
		parent::_loadViews($this->gridView, $dataView);		
	}
	
	public function addOutcome($idBusinessLine)
	{
		$this->pageTitle = 'New Outcome';
		$this->_loadEditionForm(0, $idBusinessLine, 'addOutcome');
	}
	
	public function editOutcome($idOutcome, $idBusinessLine)
	{
		$this->pageTitle = 'Edit Outcome';
		$this->_loadEditionForm($idOutcome, $idBusinessLine, 'editOutcome');
	}
	
	private function _loadEditionForm($idOutcome = 0, $idBusinessLine, $function, $cargar_completo = FALSE, $isModal = TRUE)
	{
		// La acción sólo puede realizarla un administrador. Controlo los permisos antes de continuar
		if(parent::permitted($this->controllerName, $function)) {
			$dataView['idBusinessLine'] = $idBusinessLine;
			
			// Cargo las librerías y modelos que voy a utilizar
			$this->_loadBusinessLineModels();
			
			// Para la carga de los resultados, debo obtener las líneas de negocio a las que puede asociarse al mismo
			if($idBusinessLine != 0) $blines = array($this->Business_line_dao->obtenerObjetoPorID($idBusinessLine));
			else $blines = $this->Business_line_dao->obtenerDatos();
			$dataView['business_lines'] = $blines;
			
			// Obtengo la ronda que se desea modificar y mostrar en la vista
			$dataView['outcome'] = $this->Outcome_dao->obtenerObjetoPorID($idOutcome);
			$dataView['isModal'] = $isModal;

			if(!$cargar_completo) $this->load->view($this->editionView, $dataView);
			else parent::_loadViews($this->editionView, $dataView);
		}
		else { 
			parent::loadForbiddenView();
		}
	}
	
	public function saveOutcome($idBusinessLine = 0)
	{	
		$this->pageTitle = 'Save Outcome';
	
		// Se agregan las validaciones a los campos que corresponde
		$this->form_validation->set_rules('nameOC','Outcome Name','trim|required|max_length[250]|xss_clean');
		$this->form_validation->set_rules('blineoc','Business Line','trim|required');
		
		$id = is_numeric($this->input->post('idOC')) ? $this->input->post('idOC') : 0;
        if ($this->form_validation->run() == FALSE)
        {
			// Alguno de los campos no pasó la validación anterior, vuelvo a mostrar el fomulario de edición	
			$this->_loadEditionForm($id, $idBusinessLine, 'addOutcome', TRUE, FALSE);
        }else{ // La validación del formulario fue exitosa, puedo continuar y guardar los datos
        	if($this->nombreDisponible($this->input->post('nameOC'), $this->input->post('blineoc'))) {
				// Obtengo los datos desde el formulario y los asigno al modelo
				if($id == 0) {
					$outcome = new Outcome_dto();
					$outcome->id = 0;
				}
				else $outcome = $this->Outcome_dao->obtenerObjetoPorID($id);
				$outcome->name = $this->input->post('nameOC');
				$outcome->idBusinessLine = $this->input->post('blineoc');

				$result = $this->Outcome_dao->guardar($outcome);
				
				// Valido si ocurrió algún error al intentar guardar
				$errores = $result['error_msg'];
				$dataView['result'] = $errores;
				
				if($errores == '') { // Si no hubo error y se guardó la nueva línea, continúo
						redirect($this->redirectMethod . '/' . $idBusinessLine);
				}
				else parent::_loadViews("$this->resultMessageView", $dataView);
			}
			else {
				$this->form_validation->set_message('nameOC', 'This Outcome name already exists');			
				$this->_loadEditionForm($id, $idBusinessLine, 'addOutcome', TRUE, FALSE);
			}
        }
	}
	
	public function deleteOutcome($idOutcome, $idBusinessLine = 0)
	{
		// La acción sólo puede realizarla un administrador. Controlo los permisos antes de continuar
		if(parent::permitted($this->controllerName, 'deleteOutcome')) {
			$this->pageTitle = 'Delete Outcome';
			
			if($this->validarEliminacion($idOutcome)) {
				$result = $this->Outcome_dao->borrar($idOutcome);
					
				// Valido si ocurrió algún error al intentar borrar
				$errores = $result['error_msg'];
				$dataView['result'] = $errores;
				
				if($errores == '') redirect($this->redirectMethod . '/' . $idBusinessLine);
				else parent::_loadViews("$this->resultMessageView", $dataView);
			}
			else {
				$dataView['result'] = 'Can not delete an Outcome with associated Outputs.';
				parent::_loadViews("$this->resultMessageView", $dataView);
			}
		}
		else { 
			parent::loadForbiddenView();
		}
	}

	public function permittedDelete()
	{
		$idOC = $this->input->post('item');
		
		if(!$idOC) echo FALSE;
        else {
			if($this->validarEliminacion($idOC)) echo TRUE;
        	else echo FALSE;
        }
	}

	private function validarEliminacion($idOC)
	{
    	$this->load->model($this->modelOutputDAO);

    	// Compruebo si la Outcome tiene Outputs asociadas
		$condiciones = array('idOutcome' => $idOC);
		$consulta = $this->Output_dao->obtenerObjetos($condiciones);
		if (sizeof($consulta) == 0) {
			 return TRUE;
		}
		else return FALSE;
	}

	public function existName()
	{
		$name = $this->input->post('item');
		$idParent = $this->input->post('idParent');
		
		if(!$name) echo FALSE;
        else {
			if(!$this->nombreDisponible($name, $idParent)) echo TRUE;
			else echo FALSE;
        }
	}

	public function nombreDisponible($name, $idParent)
	{
		$name = trim($name);
		$condiciones = array('name' => "$name",
							 'idBusinessLine' => $idParent);
		
		$consulta = $this->Outcome_dao->obtenerDatos($condiciones);
		if (sizeof($consulta) > 0) {
			 return FALSE; // El nombre no es válido porque ya hay otro con ese nombre
		}
		else return TRUE;
	}
}